package bitsetdemo;

public class MyBitSet {

    public byte[] elem;
    //记录当前位图当中 存在了多少个有效的数据
    public int usedSize;

    public MyBitSet() {
        this.elem = new byte[1];//默认一个字节大小
    }

    /**
     * n 是多少位 （注意如果有余数 +1 整除多给无所谓）
     * @param n
     */
    public MyBitSet(int n) {
        this.elem = new byte[n/8+1];
    }

    /**
     * 设为某一位为1
     * @param val
     */
    public void set(int val) {
        if(val < 0) {
            throw new IndexOutOfBoundsException();
        }
        int arrayIndex = val / 8;//确定大区间
        int bitIndex = val % 8;//确定大区间中的具体位置下标

        elem[arrayIndex] |= (1 << bitIndex);//不能异或，其他位置的值会变化

        usedSize++;
    }

    /**
     * 判断当前位 是不是1
     * @param val
     */
    public boolean get(int val) {
        if(val < 0) {
            throw new IndexOutOfBoundsException();
        }
        int arrayIndex = val / 8;//确定大区间
        int bitIndex = val % 8;//确定大区间中的具体位置下标

        if((elem[arrayIndex] & (1 << bitIndex)) != 0) {
            return true;
        }

        return false;
    }

    /**
     * 将对应位置 置为0
     * @param val
     */
    public void reSet(int val) {
        if(val < 0) {
            throw new IndexOutOfBoundsException();
        }
        int arrayIndex = val / 8;//确定大区间
        int bitIndex = val % 8;//确定大区间中的具体位置下标

        elem[arrayIndex] &= ~(1 << bitIndex);//不能异或，原来为0的情况就存在问题

        usedSize--;
    }

    //当前位图中存储的元素的个数
    public int getUsedSize() {
        return usedSize;
    }


}
